package sim.utils.GenVarAle;

import sim.utils.rndGen.Random;

public abstract class VariableGenerator {

	protected Random randomGenerator;

	/*
	 * Guarda el último número random usado para generar la variable aleatoria
	 * para las ditribuciones uniforme y exponencial negativa.
	 */
	protected double lastRandom = -1.0;

	/*
	 * Guarda los último dos números random usados para generar la variable
	 * aleatoria para la ditribucion normal.
	 */
	protected double lastRandoms[] = { -1.0, -1.0 }; // new double[2];

	public VariableGenerator() {
		this(Random.METODO_JAVA_NATIVO);
	}

	/**
	 * Generador de Variables Aleatorias al cual se le dice que método utilizar.
	 * El método es alguno de la clase <i>Random</i>.
	 * 
	 * @param metodo
	 *            El método a usar provisto por la clase "Random".
	 */
	public VariableGenerator(int metodo) {
		this.randomGenerator = new Random(metodo);
	}

	/**
	 * Generador de Variables Aleatorias al cual se le pasa una instancia
	 * implementada de la clase <i>Random</i> que es el generador de números
	 * aleatorios a usar.
	 * 
	 * @param randomGenerator
	 *            El método a usar. Es una instancia de "Random".
	 */
	public VariableGenerator(Random randomGenerator) {
		this.randomGenerator = randomGenerator;
	}

	/**
	 * Retorna un nuevo valor de la variable aleatoria elegida.
	 * 
	 * @return El valor de la variable aleatoria.
	 */
	public double next() {
		return this.generarValor();
	}

	/**
	 * Método que devuelve el número random usado para generar el último valor
	 * de la variable aleatoria para las ditribuciones uniforme y exponencial
	 * negativa.
	 * 
	 * @return El último random usado o -1 si no se generó ninguno.
	 */
	public double getLastRandom() {
		return this.lastRandom;
	}

	/**
	 * Método que devuelve los dos números random usados para generar el último
	 * valor de la variable aleatoria para la ditribucion normal.
	 * 
	 * @return Los últimos dos random usados o -1 si no se generó ninguno.
	 */
	public double[] getLastRandoms() {
		return lastRandoms;
	}

	/**
	 * Genera y devuelve la variable aleatoria a partir del valor Random
	 * generado por la instancia de la clase <i>Random</i>.
	 * 
	 * @param rnd
	 *            El valor aleatorio generado por la clase "Random".
	 * @return El valor de la variable aleatoria.
	 */
	protected abstract double generarValor();

}
